﻿using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;

/*5. В текстовом файле содержатся сведения о количестве учащихся в классах и их классных руководителях. Количество классов в школе не превышает 20. 
Для описания каждого класса отводится одна строка. В первых четырех позициях каждой строки файла записано имя класса (например, 5a, 10b) класса (не пишите русских букв), 
а затем количество человек в нем и ФИО руководителя. Программа по запросу выдает сведения о классе или сообщение о том, что класс не найден.*/

namespace ConsoleApplication1  //TODO 1.UpperCase 2. Part of lastname
{
    class Program
    {
        static string PATH = ".//..//..//ClassDB.txt";
        static void Main(string[] args)
        {
            string command = Console.ReadLine().ToLower();

            Console.WriteLine();
            bool valid = ValidateArgs(command);
            if (valid == false)
            {
                PrintHelp();
                return;
            }
            if (command == "list")
            {
                ListAll();
            }
            else if (command.StartsWith("class:"))
            {
                string className = command.Substring(6);
                string classNameNew="";
                if (className.Length < 4)
                {
                    classNameNew = className.PadRight(4);
                    className = classNameNew;
                }
                ListByClass(className);
            }
            else if (command.StartsWith("sv:"))
            {
                string sv = command.Substring(3);
                ListBySupervisor(sv);
            }
        }

        static void PrintHelp()
        {
            Console.WriteLine("HELP");
            Console.WriteLine("To get information about all classes type: list");
            Console.WriteLine("To get information about certain class type: class:11-b");
            Console.WriteLine("To get information about the class supervised by a certain teacher type:");
            Console.WriteLine("sp:Ivanov I.I.");
            Console.WriteLine();
        }


        static bool ValidateArgs(string command)
        {
            bool valid = false;
            if (command != null)
            {
                if (command == "list" || command.StartsWith("class:") || command.StartsWith("sv:"))
                {
                    valid = true;
                }
            }
            return valid;
        }

        static List<ClassStudent> GetClasses()
        {
            List<string> ar = new List<string>(File.ReadAllLines(PATH));
            List<ClassStudent> db = new List<ClassStudent>();
            foreach (string element in ar)
            {
                ClassStudent cs = ClassStudent.ParseFromDB(element);
                db.Add(cs);
            }
            return db;
        }

        static void ListAll()
        {
            List<ClassStudent> db = GetClasses();
            string[] headLine = { "class", "students", "supervisor" };
            SetColumnWidth(headLine);
            Console.WriteLine();
            foreach (ClassStudent element in db)
            {
                string[] s = { element.className, element.numStudents.ToString(), element.supervisor };
                SetColumnWidth(s);
            }
            Console.WriteLine();

        }

        static void ListByClass(string className)
        {
            List<ClassStudent> db = GetClasses();
            bool isFound = false;
            foreach (ClassStudent cs in db)
            {
                if (cs.className.ToLower() ==className)
                {
                    string [] headLine = { "class", "students", "supervisor" };
                    SetColumnWidth(headLine);
                    string[] s = { cs.className, cs.numStudents.ToString(), cs.supervisor };
                    SetColumnWidth(s);
                    isFound = true;
                }
            }
            if (isFound==false)
                {
                    Console.WriteLine("class " + className + " is not found");
                    
                }

            Console.WriteLine();
        }

        static void ListBySupervisor(string sv)
        {
            List<ClassStudent> db = GetClasses();
            bool isFound = false;
            foreach (ClassStudent cs in db)
            {
                if (cs.supervisor == sv)
                {
                    isFound = true;
                    string[] headLine = { "class", "students", "supervisor" };
                    SetColumnWidth(headLine);
                    string[] s = { cs.className, cs.numStudents.ToString(), cs.supervisor };
                    SetColumnWidth(s);
                }
                else if (cs.supervisor.ToLower().Contains(sv))
                {
                    Console.WriteLine("do you mean "+cs.supervisor+" ?");
                    Console.WriteLine("if YES, enter: yes");
                    Console.WriteLine("if NO, press ENTER");
                    Console.WriteLine();
                    string answer = Console.ReadLine().ToLower();
                    if (answer == "yes")
                    {

                        isFound = true;
                        string[] headLine = { "class", "students", "supervisor" };
                        SetColumnWidth(headLine);
                        string[] s = { cs.className, cs.numStudents.ToString(), cs.supervisor };
                        SetColumnWidth(s);
                        Console.WriteLine();
                    }
                }
                
            }
                if (isFound == false)
                {
                    Console.WriteLine("class supervised by " + sv + " is not found");
                }
                Console.WriteLine();
        }

        static void SetColumnWidth(string[] ar)
        {
            char[] res = new char[80];
            int[] index = { 0, 8, 18 };
            int[] columnWidth = { 5, 8, 30 };

            for (int i = 0; i < ar.Length; i++)
            {
                ar[i].CopyTo(0, res, index[i], Math.Min(ar[i].Length, columnWidth[i]));
            }
            string printLine = string.Join("", res);
            Console.Write(printLine);
        }

        
    }
}
